package com.miku.utils;

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

import org.im4java.core.IMOperation;
import org.junit.Test;

/**
 * 图像工具类，用于处理图像相关
 * @author 杜金伟 [2016年3月10日 下午10:59:42]
 */
public class ImageUtil {
	
	/**
	 * 缩放图片，等比例缩放，如果给定图片是300*200
	 * 这里给定宽度高度为100*100，那么会缩放到100*66，因为等比例
	 * @param src 			原始图片路径
	 * @param dst			保存的图片路径
	 * @param width		需要缩放到的宽度
	 * @param height		需要缩放到的高度
	 * @return 成功与否
	 */
	public static boolean resize(String src, String dst, int width, int height){
		boolean ret = false;
		try{
			IMOperation op = new IMOperation();
			op.addImage(src);
			op.quality(120d);  
			op.resize(width, height);
			op.addImage(dst);	
			MyConvertCmd cmd = new MyConvertCmd();
			cmd.run(op);
			op.closeOperation();
			ret = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return ret;
	}
	
	/**
	 * 裁图-保证宽高比，给定src原始图片，指定保存的dst路径，以及裁剪到指定的宽高度（居中裁剪）
	 * 会以w * w的形式裁剪，若图片是100*60，要求裁剪80*80，那么得到的结果将会是60*60
	 * @param src			原始图片路径
	 * @param dst			保存的图片路径
	 * @param widthHeight		需要裁切的宽度和高度
	 * @return	 成功与否
	 */
	public static boolean cropCenterScale(String src, String dst, int width, int height){
		//按照宽高比裁切一个最大范围的图片，然后resize到指定尺寸
		
		boolean ret = false;
		try{
			BufferedImage bi = ImageIO.read(new File(src));  
			int iw = bi.getWidth();  
		    int ih = bi.getHeight();
		    int cw = width;
		    int ch = height;
		    
		    int nw0 = iw;
		    int nh0 =  (int) (nw0 * ch / (float)cw);
		    
		    int nh1 =  ih;
		    int nw1 = (int) (nh1 * cw / (float)ch);
		    
		    int uw = 0;
		    int uh = 0;
		    if(nw0 <= iw && nh0 <= ih){
		    	uw = nw0;
		    	uh = nh0;
		    	
		    	if(nw0 * nh0 < nw1 * nh1 && nw1 <= iw && nh1 <= ih){
			    	uw = nw1;
			    	uh = nh1;
		    	}
		    }else if(nw1 <= iw && nh1 <= ih){
		    	uw = nw1;
		    	uh = nh1;
		    }
		    
			IMOperation op = new IMOperation();
			op.addImage(src);
			op.crop(uw, uh, (int)((iw - uw)*0.5), (int)((ih-uh)*0.5));
			op.addImage(dst);	
			MyConvertCmd cmd = new MyConvertCmd();
			cmd.run(op);
			
			if(width != uw){
				op = new IMOperation();
				op.addImage(dst);
				op.quality(120d);
				op.resize(width, height);
				op.addImage(dst);	
				cmd.run(op);
			}
			op.closeOperation();
			
			ret = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return ret;
	}
	
	public static boolean cropCenterScale2(String src, String dst, int width, int height){
		boolean ret = false;
		try{
			BufferedImage bi = ImageIO.read(new File(src));  
			int iw = bi.getWidth();  
		    int ih = bi.getHeight();
		    int cw = width;
		    int ch = height;
		    
		    int uw = Math.min(iw, cw);
		    int uh = Math.min(ih,  ch);
		    
		    int nw0 = uw;
		    int nh0 =  (int) (nw0 * ch / (float)cw);
		    
		    int nh1 =  uh;
		    int nw1 = (int) (nh1 * cw / (float)ch);
		    
		    if(nw0 <= iw && nh0 <= ih){
		    	//这一套就够了
		    	uw = nw0;
		    	uh = nh0;
		    }else if(nw1 <= iw && nh1 <= ih){
		    	uw = nw1;
		    	uh = nh1;
		    }
		    
			IMOperation op = new IMOperation();
			op.addImage(src);
			op.crop(uw, uh, (int)((iw - uw)*0.5), (int)((ih-uh)*0.5));
			op.addImage(dst);	
			MyConvertCmd cmd = new MyConvertCmd();
			cmd.run(op);
			op.closeOperation();
			
			ret = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return ret;
	}
	
	/**
	 * 裁图-方形，给定src原始图片，指定保存的dst路径，以及裁剪到指定的宽高度（居中裁剪）
	 * 会以w * w的形式裁剪，若图片是100*60，要求裁剪80*80，那么得到的结果将会是60*60
	 * @param src			原始图片路径
	 * @param dst			保存的图片路径
	 * @param widthHeight		需要裁切的宽度和高度
	 * @return	 成功与否
	 */
	public static boolean cropCenterSquare(String src, String dst, int widthHeight){
		boolean ret = false;
		try{
			BufferedImage bi = ImageIO.read(new File(src));  
			int w = bi.getWidth();  
		    int h = bi.getHeight();
		    
		    int usc = Math.min(widthHeight, Math.min(w, h));
		    
			IMOperation op = new IMOperation();
			op.addImage(src);
			op.crop(usc, usc, (int)((w-usc)*0.5), (int)((h-usc)*0.5));
			op.addImage(dst);	
			MyConvertCmd cmd = new MyConvertCmd();
			cmd.run(op);
			op.closeOperation();
			
			ret = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return ret;
	}
	
	/**
	 * 裁图，给定src原始图片，指定保存的dst路径，以及裁剪到的宽度和高度（居中裁剪）
	 * 如果图片高度不够，比如200*100图，你要裁150*150，得到的图片会是150*100
	 * @param src			原始图片路径
	 * @param dst			保存的图片路径
	 * @param width		需要裁切的宽度
	 * @param height		需要裁切的高度
	 * @return	 成功与否
	 */
	public static boolean cropCenter(String src, String dst, int width, int height){
		boolean ret = false;
		try{
			BufferedImage bi = ImageIO.read(new File(src));  
			int w = bi.getWidth();  
		    int h = bi.getHeight();
			IMOperation op = new IMOperation();
			op.addImage(src);
			op.crop(width, height, (int)((w-width)*0.5), (int)((h-height)*0.5));
			op.addImage(dst);	
			MyConvertCmd cmd = new MyConvertCmd();
			cmd.run(op);
			op.closeOperation();
			
			ret = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return ret;
	}
	
	@Test
	public void t(){
		//346 * 300
		//cropCenterScale("c:/a.jpg", "c:/a0.jpg", 80, 80);
		cropCenterScale("/Users/mqm/2016.png", "/Users/mqm/20161.png", 80, 80);
		System.out.println("success");
	}
}